001 /** 002 * Created by IntelliJ IDEA. 003 * User: Wei Wang 004 * Date: Feb 14, 2003 005 * Time: 9:34:32 PM 006 */ 007 008 package EVolve.util.painters.shapes; 009 010 import java.awt.*; 011 import java.util.*; 012 013 public abstract class Shape implements Cloneable{ 014 public int x, y; 015 protected long entity_id; 016 protected long entity_type; 017 protected HashMap consumerMap; 018 protected Color color; 019 020 public Shape(long entity_type, long entity_id) { 021 this.entity_id = entity_id; 022 this.entity_type = entity_type; 023 consumerMap = new HashMap(); 024 color = null; 025 } 026 027 public long getEntityID() { 028 return entity_id; 029 } 030 031 public Rectangle getPosition() { 032 return new Rectangle(x,y,1,1); 033 } 034 035 public void move(int x, int y) { 036 this.x = x; 037 this.y = y; 038 } 039 040 public void addConsumer(Shape consumer, int gravity) { 041 consumerMap.put(consumer,new Integer(gravity)); 042 } 043 044 public HashMap getConsumers() { 045 return consumerMap; 046 } 047 048 public long getEntityType() { 049 return entity_type; 050 } 051 052 public void setColor(Color color) { 053 this.color = color; 054 } 055 056 public Color getColor() { 057 return color; 058 } 059 060 protected void drawArrows(Graphics2D g2) { 061 Iterator it2 = consumerMap.keySet().iterator(); 062 while (it2.hasNext()) { 063 Shape consumer = (Shape)it2.next(); 064 int gravity = ((Integer)consumerMap.get(consumer)).intValue(); 065 // draw arrows 066 int x1 = x+getWidth()/2, y1 = y+getHeight()/2; 067 int x2 = consumer.x + consumer.getWidth()/2, y2 = consumer.y + consumer.getHeight()/2; 068 g2.drawLine(x1,y1,x2,y2); 069 double len = java.lang.Math.sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); 070 double angle = java.lang.Math.asin(java.lang.Math.abs(y1-y2)/len); 071 if (x1>x2) { 072 if (y1 < y2) 073 angle = 2*java.lang.Math.PI - angle; 074 } else { 075 if (y1 > y2) 076 angle = java.lang.Math.PI - angle; 077 else 078 angle = java.lang.Math.PI + angle; 079 } 080 g2.drawLine(x2,y2,(int)(x2+10*java.lang.Math.cos(angle-0.5236)),(int)(y2+10*java.lang.Math.sin(angle-0.5236))); 081 g2.drawLine(x2,y2,(int)(x2+10*java.lang.Math.cos(angle+0.5236)),(int)(y2+10*java.lang.Math.sin(angle+0.5236))); 082 g2.drawString(""+gravity+"",(x1+(x2-x1)/5),(y1-(y1-y2)/5)); 083 } 084 } 085 086 public Object clone() { 087 Shape o = null; 088 try { 089 o = (Shape)super.clone(); 090 } catch (CloneNotSupportedException e) { 091 e.printStackTrace(); 092 return null; 093 } 094 o.consumerMap = new HashMap(); 095 return o; 096 } 097 098 public abstract void draw(Graphics2D g); 099 100 public abstract void fill(Graphics2D g); 101 102 public abstract String getName(); 103 104 public abstract boolean insideShape(int x, int y); 105 106 public abstract int getWidth(); 107 108 public abstract int getHeight(); 109 110 public abstract void setSize(int width, int height); 111 }